package java基础;

import org.junit.Test;
import java.util.concurrent.CountDownLatch;

public class 三个线程有序执行 {
    @Test
    public void test1() throws InterruptedException {
        // 计数器1：T2 等待 T1 完成
        CountDownLatch latch1 = new CountDownLatch(1);
        // 计数器2：T3 等待 T2 完成
        CountDownLatch latch2 = new CountDownLatch(1);
        // 新增一个计数器：用于主线程等待 T3 完成
        CountDownLatch mainLatch = new CountDownLatch(1);
        // T1 线程：执行完通知 T2
        Thread t1 = new Thread(() -> {
            System.out.println("T1 打印");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            latch1.countDown(); // 通知 T2 可以开始
        });

        // T2 线程：等待 T1 后执行，再通知 T3
        Thread t2 = new Thread(() -> {
            try {
                latch1.await(); // 等待 T1 完成
                System.out.println("T2 打印");
                Thread.sleep(1000);
                latch2.countDown(); // 通知 T3 可以开始
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // T3 线程：等待 T2 后执行
        Thread t3 = new Thread(() -> {
            try {
                latch2.await(); // 等待 T2 完成
                System.out.println("T3 打印");
                mainLatch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // 启动顺序不影响结果（依赖由 latch 控制）
        t3.start();
        t2.start();
        t1.start();
        mainLatch.await();
    }

}